home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / gcl-1.000 / gcl-1 / gcl-1.0 / mp / mp_addmul.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-07  |  1.2 KB  |  41 lines

  1.  
  2. /*          Copyright (C) 1994 W. Schelter
  3.  
  4. This file is part of GNU Common Lisp, herein referred to as GCL
  5.  
  6. GCL is free software; you can redistribute it and/or modify it under
  7. the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GCL is distributed in the hope that it will be useful, but WITHOUT
  12. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14. for more details.
  15.  
  16. You should have received a copy of the GNU library general public
  17. license along with GCL; see the file COPYING.  If not, write to the
  18. Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20.  
  21. #include "include.h"
  22. #include "arith.h"  
  23. /*
  24.    (h = hiremainder, y = addmul(a,b), hiremainder:y == a*b + h) is true
  25. */
  26.  
  27. int addmul(x,y)
  28.      ulong x,y;
  29. {
  30.   ulong xlo,xhi,ylo,yhi;
  31.   ulong z,z2; TEMPVARS
  32.  
  33.   xlo=x&65535;xhi=x>>16;ylo=y&65535;yhi=y>>16;
  34.   z=addll(xlo*yhi,xhi*ylo);
  35.   z2=(overflow)?xhi*yhi+65536+(z>>16):xhi*yhi+(z>>16);
  36.   z=addll(xlo*ylo,(z<<16));z2+=overflow;
  37.   z=addll(z,hiremainder);hiremainder=z2+overflow;
  38.   return z;
  39. }
  40.  
  41.